Este exámen se enfoca en dos temas, gráficos y ajustes, los puntos a desarrollar son los siguientes. En una carpeta con su nombre encontrará:
6 gráficos en orden de dificultad, su tarea es escribir el código requerido para generar dicho gráfico, incluyendo títulos en los ejes, leyenda y grilla, la función a la que obedecen los datos con los que se genera el gráfico se puede encontrar en la leyenda.
3 conjuntos de datos también en orden de dificultad (data00.txt
el más fácil) debe cargar estos datos usando la función x, y = np.loadtxt('data##.txt', unpack=True)
para despues ajustarlos usando una de las técnicas vistas en clase. Si abre el archivo .txt
encontrará en el encabezado una pista sobre la función de la que provienen los datos. Para este punto debe:
Cada uno de los 2 puntos tendrá el mismo valor sobre la nota final.
A continuación se presenta el código usado para generar los parciales (sin embargo, se oculta la semilla utilizada).
In [1]:
%matplotlib inline
from matplotlib.backends.backend_pdf import PdfPages
import matplotlib.pyplot as plt
import numpy as np
import os
import json
In [2]:
np.random.seed(123)
GUYS = [
'Juan Diego Carmona Benavides',
'Andrea Carolina Forero Pineda',
'Ivan Dario Gomez Cuatindioy',
'Jorge Alberto Latorre Arroyave',
'Alejandro Martinez Castaño',
'Andres Martinez Delgado',
'Daniel Felipe Martinez Vizcaino',
'Gustavo Andres Molina Ortiz',
'Juan Sebastian Pelaez Garzon',
'Walter Mauricio Ramirez Aristizabal',
'Sergio Ramirez Velasco',
'Stephania Riaño Casabianca',
]
In [3]:
PARTIAL_DIR = 'exam1_2017_1'
SOLUTIONS_DIR = 'exam1_2017_1_solutions'
In [4]:
def create_missing_dirs(*dirs):
for folder in dirs:
if not os.path.exists(folder):
os.makedirs(folder)
create_missing_dirs(PARTIAL_DIR, SOLUTIONS_DIR)
In [5]:
def random_params(number, min_val=1, max_val=5):
return tuple(
np.round(
np.random.uniform(min_val, max_val, size=number),
decimals=1
)
)
In [6]:
def random_style():
style = np.random.choice(['-', '-.', '--'], p=[.50, .30, .20])
color = np.random.choice(['blue', 'green', 'red'])
return style, color
In [7]:
def plot(x, y, label, plot_command=None):
if plot_command is None:
plot_command=plt.plot
style, color = random_style()
plot_command(x, y, style, label=label, color=color)
plt.xlabel(r'$x$')
plt.ylabel(r'$y$')
plt.grid()
plt.legend(loc='best')
In [8]:
def cos_plot():
a, omega, phi = random_params(3)
x = np.linspace(-10, 10, 200)
y = a * np.cos(omega * x + phi)
plot(x, y,
r'$y = {:.1f} \, \cos({:.1f} x + {:.1f})$'.format(a, omega, phi))
def line_plot():
a, b = random_params(2)
x = np.linspace(-10, 10)
y = a * x + b
plot(x, y, label=r'$y = {:.1f} x + {:.1f}$'.format(a, b))
def parable_plot():
a, b, c = random_params(3)
x = np.linspace(-10, 10)
y = a * x ** 2 + b * x + c
plot(x, y,
label=r'$y = {:.1f} x ^ 2 + {:.1f} x + {:.1f}$'.format(a, b, c))
def sqrt_plot():
a, = random_params(1)
x = np.linspace(0, 10)
y = a * np.sqrt(x)
plot(x, y, label=r'$y = {:.1f} \sqrt{{x}}$'.format(a))
def exponential_plot():
a, n, = random_params(2, min_val=0.5, max_val=2)
x = np.linspace(0, 10)
y = a * x ** n
plot(x, y, label=r'$y = {:.1f} x ^ {{{:.1f}}}$'.format(a, n))
def exponential_loglog_plot():
a, n, = random_params(2)
x = np.linspace(0, 10)
y = a * x ** n
plot(x, y,
label=r'$y = {:.1f} x ^ {{{:.1f}}}$'.format(a, n),
plot_command=plt.loglog)
EASY_PLOTS = [
cos_plot,
line_plot,
parable_plot,
sqrt_plot,
exponential_plot,
exponential_loglog_plot,
]
In [9]:
def hard_plot():
components = np.random.choice(EASY_PLOTS, 2, replace=False)
for i, p in enumerate(components):
plt.subplot(1, 2, i + 1)
p()
plt.tight_layout()
HARD_PLOTS = [
hard_plot
for _ in range(10)
]
In [10]:
def harder_plot():
p1, p2, p3 = np.random.choice(EASY_PLOTS, 3, replace=False)
plt.subplot(2, 1, 1)
p1()
plt.subplot(2, 2, 3)
p2()
plt.subplot(2, 2, 4)
p3()
plt.tight_layout()
HARDER_PLOTS = [
harder_plot
for _ in range(10)
]
In [11]:
def get_x():
return np.linspace(0, 20, 1000)
In [15]:
def line_data():
a, b = random_params(2)
x = get_x()
y = a * x + b
return x, y, '$y = m x + b$', ('line', a, b)
def parable_data():
a, b, c = random_params(3)
x = get_x()
y = a * x ** 2 + b * x + c
return x, y, r'$y = a x^2 + bx + c$', ('parable', a, b, c)
def sqrt_data():
a, = random_params(1)
x = get_x()
y = a * np.sqrt(x)
return x, y, r'$y = c * \sqrt{x}$', ('sqrt', a)
def exponential_data():
a, n, = random_params(2, min_val=0.5, max_val=2)
x = get_x()
y = a * x ** n
return x, y, r'$y = A x ^ n$', ('exponential', a, n)
def logarithmic_data():
a, b, = random_params(2, min_val=0.5, max_val=2)
x = get_x()
y = a * np.log(x + b)
return x, y, r'$y = a \log(x + b)$', ('logarithm', a, b)
SUPER_EASY_DATA = [
line_data,
parable_data,
sqrt_data,
exponential_data,
logarithmic_data,
]
In [16]:
def easy_data():
d1, d2 = np.random.choice(SUPER_EASY_DATA, 2, replace=False)
x1, y1, label1, params1 = d1()
x2, y2, label2, params2 = d2()
return (
x1,
y1 + y2,
'\n'.join([label1, label2]),
(params1, params2)
)
EASY_DATA = [
easy_data
for _ in range(20)
]
In [17]:
for guy in GUYS:
guy_dir = os.path.join(PARTIAL_DIR, guy)
create_missing_dirs(guy_dir)
all_plots = (
list(np.random.choice(EASY_PLOTS, size=2, replace=False)) +
list(np.random.choice(HARD_PLOTS, size=2, replace=False)) +
list(np.random.choice(HARDER_PLOTS, size=2, replace=False))
)
pp = PdfPages(os.path.join(guy_dir, 'gráficos.pdf'))
for p in all_plots:
plt.figure()
p()
plt.tight_layout()
pp.savefig()
plt.close()
pp.close()
solutions = []
all_data = (
[np.random.choice(SUPER_EASY_DATA)] +
[np.random.choice(SUPER_EASY_DATA)] +
[np.random.choice(EASY_DATA)]
)
for i, d in enumerate(all_data):
x, y, label, conditions = d()
np.savetxt(
os.path.join(guy_dir, 'data{:02}.txt'.format(i)),
np.array([x, y]).T,
header=label,
)
solutions.append(conditions)
guy_solutions = os.path.join(SOLUTIONS_DIR, '{}.json'.format(guy))
with open(guy_solutions, 'w') as sol:
json.dump(solutions, sol, indent=4)
print('done with', guy)
In [ ]: